Balloon driver: when in autotranslate mode, pages are returned
authorkaf24@firebug.cl.cam.ac.uk <kaf24@firebug.cl.cam.ac.uk>
Sun, 30 Apr 2006 08:47:51 +0000 (09:47 +0100)
committerkaf24@firebug.cl.cam.ac.uk <kaf24@firebug.cl.cam.ac.uk>
Sun, 30 Apr 2006 08:47:51 +0000 (09:47 +0100)
to xen without traversing init_mm.
This change is needed for xen/ia64 vp model.

Signed-off-by: Isaku Yamahata <yamahata@valinux.co.jp>
linux-2.6-xen-sparse/drivers/xen/balloon/balloon.c

index f773f8edaa2cdb447a4ea7212f5bc04de57c91e7..1a7216c8bda0efe91f1b9d68739170d2f3ab0aa7 100644 (file)
@@ -550,9 +550,22 @@ struct page *balloon_alloc_empty_page_range(unsigned long nr_pages)
        scrub_pages(vstart, 1 << order);
 
        balloon_lock(flags);
-       ret = apply_to_page_range(&init_mm, vstart,
-                                 PAGE_SIZE << order, dealloc_pte_fn, NULL);
-       BUG_ON(ret);
+       if (xen_feature(XENFEAT_auto_translated_physmap)) {
+               unsigned long gmfn = __pa(vstart) >> PAGE_SHIFT;
+               struct xen_memory_reservation reservation = {
+                       .nr_extents   = 1,
+                       .extent_order = order,
+                       .domid        = DOMID_SELF
+               };
+               set_xen_guest_handle(reservation.extent_start, &gmfn);
+               ret = HYPERVISOR_memory_op(XENMEM_decrease_reservation,
+                                          &reservation);
+               BUG_ON(ret != 1);
+       } else {
+               ret = apply_to_page_range(&init_mm, vstart, PAGE_SIZE << order,
+                                         dealloc_pte_fn, NULL);
+               BUG_ON(ret);
+       }
        current_pages -= 1UL << order;
        totalram_pages = current_pages;
        balloon_unlock(flags);